package com.itheima.springbootwebtlias.aspect;


import com.itheima.springbootwebtlias.mapper.EmpLoginLogMapper;
import com.itheima.springbootwebtlias.pojo.Emp;
import com.itheima.springbootwebtlias.pojo.EmpLoginLog;
import com.itheima.springbootwebtlias.pojo.Result;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.Map;

@Slf4j
@Component
//@Aspect
public class EmpLoginLogAspecr {
    @Autowired
    private EmpLoginLogMapper empLoginLogMapper;

    //切入点表达式：只需要对一个登录方法进行增强（建议使用execution）
    @Around("execution (* com.itheima.springbootwebtlias.controller.LoginController.login(com.itheima.springbootwebtlias.pojo.Emp)); ")
   //通知类型：环绕通知
    public Object recordOperationLog(ProceedingJoinPoint pjp/*连接点目标方法，封装目标方法的运行信息*/){
        //a.获取目标方法执行耗时，借助环绕通知的灵活性读取
        long start =System.currentTimeMillis();
        Object result =null;
        try{
            //执行目标方法开始
            result=pjp.proceed();
            //执行目标方法结束
        } catch (Throwable e) {
            result= Result.error(e.getMessage());//异常情况，自行构建异常对象
        }finally {//保证不管登录成功还是失败，都记录日志
            long end=System.currentTimeMillis();
            long costTime=end-start;

        //b.获取令牌：获取目标方法login登录结果,从result中获取令牌
        Result result2=(Result) result;
        Map map=(Map)result2.getData();//获取result的data数据
        String token="";
        if(map!=null){//进行非null判断原因：登录失败，没有data，无法获取data中的token，因此只需要排除失败的情况
            token=(String) map.get("token");
        }

        //c.获取登录结果：获取目标方法login登录结果
        int code=(Integer)result2.getCode();
        short isSuccess=(short) code;

        //d.获取请求参数：通过连接点对象ProceedingJoinPoint，获取目标方法参数
        Emp emp =(Emp)pjp.getArgs()[0];//目标方法只有一个参数:Emp

        //1.定义操作日志对象，收集操作日志信息
        EmpLoginLog empLoginLog =new EmpLoginLog();
        //通过连接点对象ProceedingJoinPoint，获取目标方法参数
        empLoginLog.setLoginTime(LocalDateTime.now());
        empLoginLog.setUsername(emp.getUsername());
        empLoginLog.setPassword(emp.getPassword());
        empLoginLog.setIsSuccess(isSuccess);
        empLoginLog.setJwt(token);
        empLoginLog.setCostTime(costTime);
        //2.调用操作日志的持久层接口，添加日志信息到操作日志表中
        empLoginLogMapper.insert(empLoginLog);

    }
        return result;
    }

}
